import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  /**
  * 在`getters`中新增：
   1. 有效商品列表=》无效商品（没库存或下架了）
   2. 选中的购物车商品数据
   3. 选中商品总价
   4. 购物车中有效商品是否是全部选中状态
  */
  getters: {
    // 有效商品列表(购物车页面列表渲染)
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 选中的购物车商品数据
    validSeled: (state, getterts) => {
      return getterts.validList.filter(item => item.selected)
    },
    // 选中的购物车商品数据总价
    validSeledTotal: (state, getterts) => {
      return getterts.validSeled.reduce((acc, item) => (acc += item.count * item.nowPrice), 0)
    },
    // 有效商品是否是全部选中状态
    isAll: (state, getterts) => {
      return getterts.validList.every(item => item.selected)
    }
  },
  mutations: {
    // 存储从服务器获取的购物车数据
    /**
     *
     * @param {*} state
     * @param {*} list 服务器获取的购物车数据
     */
    setList (state, list) {
      state.list = list
    },
    /**
     *
     * @param {*} state
     * @param {*} good 当前要加入购物车的商品对象
     */
    addCart (state, good) {
      /**
       * 把good加入list的业务逻辑：
       * 注意：判断之前是否加入过
       * 1. 加入过=》累加数量
       * 2. 没加入过 =》新增
       */
      const addIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addIndex > -1) {
        // 加入过=》addIndex就是已经加入购物车商品的索引
        state.list[addIndex].count += good.count
      } else {
        // 没有加入过
        state.list.unshift(good)
      }
    },
    /**
     *
     * @param {*} state
     * @param {*} {good-当前勾选的商品, isChecked-当前商品选中状态}
     */
    singelCheck (state, { good, isChecked }) {
      // 1. 找到当前要做单选的商品数据
      const currGood = state.list.find(item => item.skuId === good.skuId)
      // 2. 修改选中状态
      currGood.selected = isChecked
    },
    /**
     *
     * @param {*} state
     * @param {*} isAll 全选框是否选中的状态
     */
    allCheck (state, isAll) {
      state.list.forEach(item => {
        item.selected = isAll
      })
    },
    /**
     *
     * @param {*} state
     * @param {*} good 当前删除商品对象
     */
    delCart (state, good) {
      const delIndex = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(delIndex, 1)
    },
    // 数量修改mutation
    changeCount (state, { good, count }) {
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = count
    }
  },
  actions: {
    // 登录后获取购物车列表数据
    async getListAction ({ commit }) {
      const res = await findCartList()
      console.log('最新购物车列表数据：', res)
      commit('setList', res)
    },
    /**
     * 合并购物车
     * @param {*} param0
     */
    async mergeCartAction ({ state, dispatch }) {
      /**
       * 登录后合并购物车思路：
       * 1. 判断state.list有无数据
       * 2. 如果有调用后台合并接口进行合并
       */
      if (state.list.length > 0) {
        // mergeData 需要合并的购物车数据
        const mergeData = state.list.map(item => {
          return {
            skuId: item.skuId,
            selected: item.selected,
            count: item.count
          }
        })
        console.log('====================================')
        console.log('需要合并的购物车树：', mergeData)
        console.log('====================================')
        await mergeLocalCart(mergeData)
      }
      // 从服务器获取购物车列表数据...
      dispatch('getListAction')
    },
    /**
     *
     * @param {*} param{rootState === store.state}
     * @param {*} good 当前要加入购物车的商品对象
     * 需求梳理：需要判断是否是登录状态
     * 1. 未登录 =》也能使用购物车=》只是存到vuex并持久化到本地
     * 2. 已登录 =》也能使用购物车=》调用后台接口存储购物车数据，然后存到vuex
     */
    async addCartAction ({ commit, rootState, dispatch }, good) {
      // rootState 获取其它模块state数据
      if (rootState.user.profile.token) {
        // 已登录（随后做）=>调用后台接口
        console.log('已登录')
        // 1. 把商品存到数据库
        await insertCart({ skuId: good.skuId, count: good.count })
        // 2. 重新获取购物车最新数据
        dispatch('getListAction')
        return '加入成功！'
      } else {
        // 未登录
        console.log('未登录')
        commit('addCart', good)
        return '加入成功！'
      }
    },
    /**
     * 商品单选
     * @param {*} param0
     * @param {*} param1
     */
    async singelCheckAction ({ commit, rootState, dispatch }, { good, isChecked }) {
      // rootState 获取其它模块state数据
      if (rootState.user.profile.token) {
        // 已登录（随后做）=>调用后台接口
        await updateCart({ ...good, selected: isChecked })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('singelCheck', { good, isChecked })
      }
    },
    /**
     * 商品全选/取消全选
     * @param {*} param0
     * @param {*} isAll
     */
    async allCheckAction ({ commit, rootState, getters, dispatch }, isAll) {
      // rootState 获取其它模块state数据
      if (rootState.user.profile.token) {
        // 已登录（随后做）=>调用后台接口
        // ids有效商品列表的集合
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: isAll, ids })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('allCheck', isAll)
      }
    },
    /**
     *
     * @param {*} param0
     * @param {*} good
     */
    async delCartAction ({ commit, rootState, dispatch }, good) {
      // rootState 获取其它模块state数据
      if (rootState.user.profile.token) {
        // 已登录（随后做）=>调用后台接口
        await deleteCart([good.skuId])
        dispatch('getListAction')
      } else {
        // 未登录
        commit('delCart', good)
      }
    },
    async changeCountAction ({ commit, rootState, dispatch }, { good, count }) {
      // rootState 获取其它模块state数据
      if (rootState.user.profile.token) {
        // 已登录（随后做）=>调用后台接口
        await updateCart({ ...good, count })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('changeCount', { good, count })
      }
    }
  }
}
